context isolation은 preload script와 electron 내부 로직이 분리된 컨텍스트에서 실행되는것을 보장한다.
보안 목적으로 electron 내부 코드와 api가 preload script에 접근하는 것을 예방한다.
context isolation이 되기 전
1// preload.js
2window.myAPI = {
3 doAThing: () => {}
4}
5---
6// renderer.js
7window.myAPI.doAThing()
window 객체에 바로 넣기 때문에 위험하다.
context isolation 적용 후
1// preload.js
2const { contextBridge } = require('electron')
3
4contextBridge.exposeInMainWorld('myAPI', {
5 doAThing: () => {}
6})
7---
8// renderer.js
9window.myAPI.doAThing()
contextBridge를 통해서 안전하게 전달한다.
api를 구현할 때, 주의할 점으로 ipc와 같은 api를 그대로 노출하는 것은 사용하기에 위험하다. 예를 들어,
1contextBridge.exposeInMainWorld('myAPI', {
2 send: ipcRenderer.send
3})
위 코드와 같이 사용한다면 사용처에서 ipc의 send를 필터링 없이 사용가능하게 된다. 따라서 아래와 같이 특정한 이벤트네임으로 동작을 정한다.
1contextBridge.exposeInMainWorld('myAPI', {
2 loadPreferences: () => ipcRenderer.invoke('load-prefs')
3})